class Solution
{
public:
    void rotate(vector<vector<int>>& matrix)
    {
        int left = 0, right = matrix.size() - 1; // 初始化左右边界
        while (left < right) // 当左边界小于右边界时继续循环，处理从外到内的每一层
        {
            for(int i = 0; i < right - left; ++i) // 遍历当前层的每个元素，i表示偏移量
            {
                int top = left, bottom = right; // 当前层的上下边界与左右边界相同
                int topLeft = matrix[top][left + i]; // 保存左上角的元素
                matrix[top][left + i] = matrix[bottom - i][left]; // 左下角元素移动到左上角
                matrix[bottom - i][left] = matrix[bottom][right - i]; // 右下角元素移动到左下角
                matrix[bottom][right - i] = matrix[top + i][right]; // 右上角元素移动到右下角
                matrix[top + i][right] = topLeft; // 将保存的左上角元素放到右上角
            }
            ++left, --right; // 收缩边界，进入下一层
        }
    }
};